// 可迭代接口：Iterable
// ES6 规定，默认的 Iterator 接口部署在数据结构的Symbol.iterator属性，或者说，一个数据结构只要具有Symbol.iterator属性，就可以认为是“可遍历的”（iterable）。
// 具有原生iterator的数据结构：
// Array , Map, Set, String, 生成器函数（generator函数），TypedArray, 函数的argulements对象，NodeList对象（节点对象）；
// 基于for of ：只能遍历数组类型的数据结构，不能遍历普通对象类型
// 默认调用场景：
// for....of...循环， 解构赋值， 扩展运算符， yield*关键字
// 为什么for of 遍历循环是一种数据统一遍历方式？
// 他在内部核心是调用了一个叫Iterable的可迭代器[Symbol.iterator]，从而遍历内部所有的接口数据
// 详见：./iterator.jpg
// https://blog.csdn.net/qdmoment/article/details/86488304

// 数组类型数据（Map/Set/Array）,都内置一个iterator的迭代器
const arr = [100, 200, 300]
console.log(arr); //[ 100, 200, 300 ]
// iterable:迭代器维护了一个指针，每次调用next（）将会把指针后移，知道数据对象为空，以{value:undedined,done:true}返回
const iterator = arr[Symbol.iterator]()
console.log(iterator); //Object [Array Iterator] {}
console.log(iterator.next()); //{ value: 100, done: false }
console.log(iterator.next()); //{ value: 200, done: false }
console.log(iterator.next()); //{ value: 300, done: false }
console.log(iterator.next()); //{ value: undefined, done: true }

// 总结：所有可以被for of遍历的数据类型都会在内部挂载一个iterator的迭代器，通过调用iterator.next（）实现对对象的遍历


const newSet = new Set(['foo', "bar"])
const iteratorEl = newSet[Symbol.iterator]()
console.log(newSet);
console.log(iteratorEl.next()); //{ value: 'foo', done: false }
console.log(iteratorEl.next()); //{ value: 'bar', done: false }
console.log(iteratorEl.next()); //{ value: undefined, done: true }

const newMap = new Map()
newMap.set('sss', 'sss');
newMap.set('ddd', 'ddd');
const iteratorEE = newMap[Symbol.iterator]()
console.log(newMap);
console.log(iteratorEE.next()); //{ value: [ 'sss', 'sss' ], done: false }
console.log(iteratorEE.next()); //{ value: [ 'ddd', 'ddd' ], done: false }
console.log(iteratorEE.next()); //{ value: undefined, done: true }


for (let i of newSet) {
    console.log(i);
}
for (let [key, value] of newMap) {
    console.log(key, value);
}
// for of 不支持普通对象，如果要迭代对象，可以for in  或者for of Iterator()迭代调用
const obj = { name: "xxx", age: 20 }
    // for (let i of obj) {
    //     console.log(i); // TypeError: obj is not iterable
    // }
    // 遍历对象：for in 
    // for (var i in obj) {
    //     console.log('for in obj', i)
    // }